package ar.edu.caece.dns.modelo.util;

import ar.edu.caece.dns.modelo.registros.NombreDominio;
import ar.edu.caece.dns.modelo.utils.NombreDominioParser;
import junit.framework.TestCase;

/**
 * Casos de prueba para {@link NombreDominioParser}
 * 
 * @author Lucas - Jun 23, 2012 5:05:36 PM
 */
public class NombreDominioParserTestCase extends TestCase {

	public void testParse() {

		String cadena = "www.caece.edu.ar";
		String[] etiquetas = new String[] { "www", "caece", "edu", "ar" };
		NombreDominioParser parser = new NombreDominioParser();

		NombreDominio esperado = new NombreDominio();
		esperado.setValor(cadena);
		esperado.setEtiquetas(etiquetas);

		NombreDominio obtenido = parser.parse(cadena);

		assertNotNull(obtenido);
		assertEquals(esperado.getValor(), obtenido.getValor());

		for (int i = 0; i < etiquetas.length; i++)
			assertEquals(etiquetas[i], obtenido.get(i));

		esperado = new NombreDominio();
		esperado.setValor("ar");
		esperado.setEtiquetas(new String[] { "ar" });

		obtenido = parser.parse("ar");
		assertNotNull(obtenido);
		assertEquals(esperado, obtenido);
	}

	public void testObtenerPadre() {

		NombreDominioParser parser = new NombreDominioParser();

		NombreDominio abuelo = parser.parse("ar");
		NombreDominio padre = parser.parse("ar.edu");
		NombreDominio hijo = parser.parse("ar.edu.caece");
		NombreDominio nieto = parser.parse("ar.edu.caece.www");

		NombreDominio padreObtenido = parser.obtenerPadre(hijo);
		assertNotNull(padreObtenido);
		assertEquals(padre, padreObtenido);

		padreObtenido = parser.obtenerPadre(padre);
		assertNotNull(padreObtenido);
		assertEquals(abuelo, padreObtenido);

		padreObtenido = parser.obtenerPadre(nieto);
		assertNotNull(padreObtenido);
		assertEquals(hijo, padreObtenido);
		
		padreObtenido = parser.obtenerPadre(abuelo);
		assertNull(padreObtenido);
	}
	
	public void testObtenerSubdominio() {
		
		NombreDominioParser parser = new NombreDominioParser();

		NombreDominio nombreDominio = parser.parse("www.caece.edu.ar");
		
		NombreDominio subdominioCompleto = parser.parse("www.caece.edu.ar");
		NombreDominio subdominioCompletoInvertido = parser.parse("ar.edu.caece.www");
		NombreDominio subdominioWWWCaece = parser.parse("www.caece");
		NombreDominio subdominioCaeceEduAr = parser.parse("caece.edu.ar");
		NombreDominio subdominioCaeceWWW = parser.parse("caece.www");
		NombreDominio subdominioEduCaeceWWW = parser.parse("edu.caece.www");
		NombreDominio subdominioCaece = parser.parse("caece");
		NombreDominio subdominioWWW = parser.parse("www");
		NombreDominio subdominioAr = parser.parse("ar");
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 1, 4));
		assertEquals(subdominioCompleto, parser.obtenerSubdominio(nombreDominio, 1, 4));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 4, 1));
		assertEquals(subdominioCompletoInvertido, parser.obtenerSubdominio(nombreDominio, 4, 1));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 1, 2));
		assertEquals(subdominioWWWCaece, parser.obtenerSubdominio(nombreDominio, 1, 2));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 2, 4));
		assertEquals(subdominioCaeceEduAr, parser.obtenerSubdominio(nombreDominio, 2, 4));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 2, 1));
		assertEquals(subdominioCaeceWWW, parser.obtenerSubdominio(nombreDominio, 2, 1));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 3, 1));
		assertEquals(subdominioEduCaeceWWW, parser.obtenerSubdominio(nombreDominio, 3, 1));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 2, 2));
		assertEquals(subdominioCaece, parser.obtenerSubdominio(nombreDominio, 2, 2));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 1, 1));
		assertEquals(subdominioWWW, parser.obtenerSubdominio(nombreDominio, 1, 1));
		
		assertNotNull(parser.obtenerSubdominio(nombreDominio, 4, 4));
		assertEquals(subdominioAr, parser.obtenerSubdominio(nombreDominio, 4, 4));

	}

}
